package com.study.example.study.extension.caffeinecache;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalListener;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * channel 缓存
 *
 * @author RenYuLiang
 */
@Slf4j
public final class StringCaffeineCache {

    /**
     * 渠道缓存
     */
    private static final Cache<String, CaffeineCacheDTO> CHANNEL_CACHE = Caffeine.newBuilder()
            // 设置缓存容器的初始容量为 1
            .initialCapacity(1)
            // 设置缓存最大容量为 10，超过 10 之后就会按照 LRU 最近最少使用算法来移除缓存项
            .maximumSize(10)
            // 设置写入缓存后 1 小时后过期
            .expireAfterWrite(1, TimeUnit.HOURS)
            // 设置缓存的移除通知
            .removalListener((RemovalListener<String, CaffeineCacheDTO>) (key, value, removalCause)
                    -> log.info("StringCaffeineCache缓存淘汰,key={},value={},removalCause={}", key, value, removalCause))
            .build();


    /**
     * 禁止实例化
     */
    private StringCaffeineCache() {

    }

    /**
     * 设置
     *
     * @param key   String
     * @param value ChannelDTO
     */
    public static void putCache(final String key, final CaffeineCacheDTO value) {
        log.info("StringCaffeineCache放入缓存,key={},value={}", key, value);
        CHANNEL_CACHE.put(key, value);
    }

    /**
     * 获取
     *
     * @param key String
     * @return CaffeineCacheDTO 可能返回 null
     */
    public static CaffeineCacheDTO getCache(final String key) {
        CaffeineCacheDTO value = CHANNEL_CACHE.getIfPresent(key);
        log.debug("StringCaffeineCache获取缓存,key={},value={}", key, value);
        return value;
    }

}
